﻿using System.Collections.Generic;
using System.IO;
using System.Diagnostics;
using SharedTypes;
using System;

namespace RarAlgorithm
{
    [AlgInfo("Rar algorithm")]
    public class RarAlgorithm : Algorithm
    {
        private string compressionTargetDirectory
        { set; get; }
        private string compressionTargetArchName;

        public RarAlgorithm(string exe, string name, string path, string fullPath, IDictionary<int, LinkedParameter> parameters)
            : base(exe, name, path, fullPath, parameters)
        {
            
        }

        /// <summary>
        /// Запускает процесс исполнительного файла.
        /// </summary>
        /// <param name="parameters">Список применяемых параметров.</param>
        /// <returns>Размер полученого архива.</returns>
        public override long DoCompression(IDictionary<int, LinkedParameter> parameters)
        {
            string arguments = string.Format("a -m{0} -mt{1} -md{2} {3} {4} {5}",
                                             parameters[0].parameter.CurrentValue.ToString(),
                                             parameters[1].parameter.CurrentValue.ToString(),
                                             parameters[2].parameter.CurrentValue.ToString(),
                                             parameters[3].parameter.CurrentValue.ToString(),
                                             "\"" + compressionTargetArchName + "\"", "\"" + compressionTargetDirectory + "\"");
            return Compress(arguments);
        }


        /// <summary>
        /// Устанавливает директория, исполнительного файла которой будет выполняться.
        /// </summary>
        /// <param name="path">Абсолютный путь к директории.</param>
        public override void SetCompressionTarget(string path)
        {
            compressionTargetDirectory = path;
            compressionTargetArchName = path + @"\test.rar";
        }

        /// <summary>
        /// Запускает процесс исполнительного файла с параметрами, рекомендуемыми поставщиком
        /// алгоритма исполнительного файла.
        /// </summary>
        /// <param name="parameters">Список применяемых параметров.</param>
        /// <returns>Размер полученного архива.</returns>
        public override long GetResultWithRecomendedParameters(IDictionary<int, LinkedParameter> parameters)
        {
            return Compress(string.Format("a -m{0} {1} {2}", parameters[0].parameter.DefaultValue.ToString(),
                "\"" + compressionTargetArchName + "\"", "\"" + compressionTargetDirectory + "\""));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="arguments"></param>
        /// <returns></returns>
        private long Compress(string arguments)
        {
            long result = 0;
            DirectoryInfo dir = new DirectoryInfo(compressionTargetDirectory);

            if (dir.Exists)
            {
                ProcessStartInfo info = new ProcessStartInfo("RAR.EXE", arguments);
                info.UseShellExecute = false;
                info.CreateNoWindow = true;
                Process proc = new Process();
                proc.StartInfo = info;
                DateTime startTime = DateTime.Now;
                proc.Start();
                proc.WaitForExit();
                //proc.ExitCode;
                DateTime endTime = DateTime.Now;
                TimeElapsed = endTime.TimeOfDay.Subtract(startTime.TimeOfDay);

                if (File.Exists(compressionTargetArchName))
                {
                    result = File.ReadAllBytes(compressionTargetArchName).Length;
                    File.Delete(compressionTargetArchName);
                }
            }

            return result;
        }
    }
}
